www.gusucode.com > VC++ 高仿QQ2008好友界面源码程序 > VC++ 高仿QQ2008好友界面源码程序/code/MyICQ/BmpTab.cpp
// BmpTab.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "MyICQ.h" #include "BmpTab.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBmpTab CBmpTab::CBmpTab() { m_bIsCDC=FALSE; m_dwState=HTNORMAL; m_hIconHand=AfxGetApp()->LoadCursor(IDC_HANDLE); m_iCurrentSelect=1; m_iCurrentFouce=-1; } CBmpTab::~CBmpTab() { } BEGIN_MESSAGE_MAP(CBmpTab, CStatic) //{{AFX_MSG_MAP(CBmpTab) ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_ERASEBKGND() ON_WM_MOUSEMOVE() ON_WM_TIMER() ON_WM_SETCURSOR() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CBmpTab message handlers void CBmpTab::OnPaint() { CPaintDC dc(this); CRect rc;GetClientRect(&rc); CDC memDC;memDC.CreateCompatibleDC(&dc); CBitmap bmpBack;bmpBack.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height()); CBitmap *bmpOld=memDC.SelectObject(&bmpBack); memDC.BitBlt(0,0,rc.Width(),rc.Height(),&m_memDC,0,0,SRCCOPY); CRect rcItem; TABITEM* tabItem; for(int i=0;i<m_aryItem.GetSize();i++) { CDC tmpDC;tmpDC.CreateCompatibleDC(&dc); tabItem=(TABITEM*)m_aryItem.GetAt(i); // if(tabItem->pVoid) // ((CWnd*)(tabItem->pVoid))->ShowWindow(SW_HIDE); GetTabItemRect(i,&rcItem); bmpOld=tmpDC.SelectObject(&m_bmpNormal); if(m_iCurrentFouce==i) { bmpOld=tmpDC.SelectObject(&m_bmpHover); } if(m_iCurrentSelect==i) { bmpOld=tmpDC.SelectObject(&m_bmpHdown); // if(tabItem->pVoid) // ((CWnd*)(tabItem->pVoid))->ShowWindow(SW_NORMAL); } memDC.BitBlt(rcItem.left+1,rcItem.top,rcItem.Width(),rcItem.Height(),&tmpDC,0,0,SRCCOPY); tmpDC.SelectObject(bmpOld); ReleaseDC(&tmpDC); tmpDC.DeleteDC(); ::DrawIconEx(memDC,rcItem.left+5,rcItem.top+5,tabItem->icon,24,24,0,NULL,DI_NORMAL); } dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY); // CStatic::OnPaint(); } void CBmpTab::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default // AfxMessageBox("dd"); //m_dwState=HTHDOWN; CRect rcItem; for(int i=0;i<m_aryItem.GetSize();i++) { CWnd *tabItemView; tabItemView=(CWnd*)((TABITEM*)m_aryItem.GetAt(i))->pVoid; if(tabItemView) tabItemView->ShowWindow(SW_HIDE); GetTabItemRect(i,&rcItem); if(rcItem.PtInRect(point)) { m_iCurrentSelect=i; if((m_aryItem.GetAt(i))!=NULL) { if(tabItemView) tabItemView->ShowWindow(SW_NORMAL); } } } Invalidate(); CStatic::OnLButtonDown(nFlags, point); } BOOL CBmpTab::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default if(!m_bIsCDC) { m_memDC.CreateCompatibleDC(pDC); CRect rc;GetClientRect(&rc); CBitmap bmpBack;bmpBack.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); m_memDC.SelectObject(&bmpBack); m_memDC.BitBlt(0,0,rc.Width(),rc.Height(),pDC,0,0,SRCCOPY); // m_memDC.SelectObject(bmpOld); // bmpOld->DeleteObject(); m_bIsCDC=TRUE; } return TRUE; //return CStatic::OnEraseBkgnd(pDC); } void CBmpTab::TransparentBlt1(CDC *pDC, CBitmap &Image, CRect &rect, COLORREF rgbMask) { CDC ImageDC,MaskDC; CBitmap *pOldImage; CBitmap maskBitmap,*pOldMaskDCBitmap ; // Image.LoadBitmap(nBmp); ImageDC.CreateCompatibleDC(pDC); pOldImage=ImageDC.SelectObject(&Image); MaskDC.CreateCompatibleDC(pDC); maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL ); pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap ); ImageDC.SetBkColor(rgbMask); MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY ); ImageDC.SetBkColor(RGB(0,0,0)); ImageDC.SetTextColor(RGB(255,255,255)); ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND); pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND); pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT); MaskDC.SelectObject(pOldMaskDCBitmap); ImageDC.SelectObject(pOldImage); } void CBmpTab::SetIcon(int nIndex,UINT nIcon,void *pVoid) { TABITEM* tabItem=new TABITEM; tabItem->nIndex=nIndex; tabItem->icon=AfxGetApp()->LoadIcon(nIcon); tabItem->pVoid=pVoid; m_aryItem.Add(tabItem); } void CBmpTab::SetBmp(UINT nBmpNormal, UINT nBmpHover, UINT nBmpHdown) { m_bmpNormal.LoadBitmap(nBmpNormal); m_bmpHover.LoadBitmap(nBmpHover); m_bmpHdown.LoadBitmap(nBmpHdown); } void CBmpTab::AddTabItem(TABITEM &item) { //m_aryItem.Add(&item); } void CBmpTab::AddTabItem(UINT nBmpNormal, UINT nBmpHover, UINT nBmpHdown, UINT nIcon, void *pVoid) { //if(m_aryItem.GetSize()==0) // CBitmap bmpNormal,bmpHover,bmpHdown; // HICON icon; // // bmpNormal.LoadBitmap(nBmpNormal); // // bmpHover.LoadBitmap(nBmpHover); // // bmpHdown.LoadBitmap(nBmpHdown); // icon=AfxGetApp()->LoadIcon(nIcon); // // TABITEM* tabitm=new TABITEM; // // tabitm.rcItem=rc; // tabitm->bmpNormal.LoadBitmap(nBmpNormal); // tabitm->bmpHover.LoadBitmap(nBmpHover); // tabitm->bmpHdown.LoadBitmap(nBmpHdown); // tabitm->icon=icon; // tabitm->pVoid=NULL; // // m_aryItem.Add((void*)tabitm); } void CBmpTab::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //AfxMessageBox("dd"); // m_dwState=HTHOVER; // CRect rc; // BOOL IsTrue=FALSE; // for(int i=0;i<m_aryItem.GetSize();i++) // { // GetTabItemRect(i,&rc); // if(rc.PtInRect(point)) // { // m_iCurrentFouce=i; // IsTrue=TRUE; // } // } // if(!IsTrue) // m_iCurrentFouce=-1; SetTimer(1,10,NULL); Invalidate(); CStatic::OnMouseMove(nFlags, point); } void CBmpTab::PreSubclassWindow() { // TODO: Add your specialized code here and/or call the base class ModifyStyle(0,SS_NOTIFY); CStatic::PreSubclassWindow(); } void CBmpTab::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPoint pt(GetMessagePos()); ScreenToClient(&pt); CRect rc; BOOL bIsOK=FALSE; for (int i=0;i<m_aryItem.GetSize();i++) { GetTabItemRect(i,&rc); if(rc.PtInRect(pt)) { m_iCurrentFouce=i; bIsOK=TRUE; } } if (!bIsOK) { m_iCurrentFouce=-1; KillTimer(1); } Invalidate(); // if(rc.PtInRect(pt)) // { // m_dwState=HTHOVER; // } // else // { // m_dwState=HTNORMAL; // // // } // CStatic::OnTimer(nIDEvent); } BOOL CBmpTab::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: Add your message handler code here and/or call default // CPoint pt(GetMessagePos()); // CRect rc;GetClientRect(&rc); // //ScreenToClient(&pt); // if(rc.PtInRect(pt)) // { ::SetCursor(m_hIconHand); // } return TRUE; // return CStatic::OnSetCursor(pWnd, nHitTest, message); } void CBmpTab::GetTabItemRect(int nIndex, CRect *rc) { // if(m_bmpNormal.GetSafeHandle()) // { BITMAP bm; m_bmpNormal.GetBitmap(&bm); rc->SetRect(0,nIndex*bm.bmHeight,bm.bmWidth,nIndex*bm.bmHeight+bm.bmHeight); // } // else // { // rc->SetRect(0,0,0,0); // } }